﻿using System;
using System.IO;
namespace Ehai.Web.Framework.Rules
{
    class CompressRuleHandle : IMsgRuleHandle
    {
        #region IMsgRuleHandle 成员

#if DEBUG

        private int _execStatus = 0;
        public int ExecStatus
        {
            get { return _execStatus; }
        }
#endif

        public const string Name = "compress";
        #region  打包


        /// <summary>
        /// 将选中的文件压缩打包为一个zip，只有一个文件则不予处理
        /// </summary>
        /// <param name="p">
        /// 0 操作类型，总是compress<br/>
        /// 1 项目的根目录ProjectPath，压缩后的文件将存于此处，同时也是临时文件夹创建位置<br/>
        /// 2 文件列表，以竖线‘|’分隔的全路径<br/>
        /// </param>
        /// <param name="ci">环境变量</param>
        /// <example>示例</example>
        /// <code>
        /// string[][] r=Execute(new string[3] { "compress", @"D:\TestFiles\Base", @"D:\TestFiles\Srcs\1.txt|D:\TestFiles\Srcs\2.txt" },ci);
        /// </code>
        /// <exception cref="Ehai.Web.Framework.WebException">
        /// Ehai.Web.Framework.WebException:文件压缩过程中出现异常
        /// </exception>
        /// <returns>
        /// 返回值是一个二维交错数组。大小[1][2]<br/>
        /// [0][0]返回最终文件名(压缩后的zip，或未压缩的单个文件)<br />
        /// [0][1]代表是否进行了压缩操作，返回值为true或false
        /// </returns>


        public string[][] Execute(string[] p, ContextInfo ci)
        {
            if (p.Length < 3)
            {

#if DEBUG
                _execStatus = -2;
#endif

                return null;
            }

            try
            {
                if (!Directory.Exists(p[1]))
                {

#if DEBUG
                    _execStatus = 1;
#endif

                    throw new Exception("错误的根路径：" + p[1]);
                }
                if (string.IsNullOrEmpty(p[2]))
                {

#if DEBUG
                    _execStatus = 2;
#endif

                    throw new Exception("文件列表为null或Empty");
                }

                Guid gid = Guid.NewGuid();
                string dirName = gid.ToString("n");
                string zipName = DateTime.Now.ToString("yyMMddHHmmss") + "_" + dirName.Substring(0, 4);
                string downfile = String.Empty;
                bool del = false;
                string[] filelist = p[2].Split('|');
                string tempdir = Path.Combine(p[1], dirName);

                if (filelist.Length == 1)
                {
                    downfile = filelist[0];
                    del = false;
                }
                else
                {
                    DirectoryInfo dir = Directory.CreateDirectory(tempdir);//创建临时文件夹
                    for (int i = 0; i < filelist.Length; i++)
                    {

                        File.Copy(filelist[i], dir.FullName + Path.DirectorySeparatorChar + Path.GetFileName(filelist[i]), true);

                    }
                    Zip.ZipFile(dir.FullName, Path.Combine(p[1], zipName + ".zip"));
                    Directory.Delete(dir.FullName, true);
                    downfile = Path.Combine(p[1], zipName + ".zip");
                    del = true;
                }

                string[][] result = { new string[2] { downfile, del.ToString() } };

#if DEBUG
                _execStatus = 0;
#endif

                return result;
            }
            catch (Exception e)
            {

#if DEBUG
                _execStatus = -1;
#endif

                throw new Ehai.Web.Framework.WebException("Ehai.Web.Framework.Rules.Compress", "文件压缩过程中出现异常", e);
            }
        }
        #endregion

        public string GetHelpInfo()
        {
            return "将选中的文件压缩打包为一个zip，只有一个文件则不予处理";
        }

        public string GetHelpDetail()
        {
            return "将选中的文件压缩打包为一个zip.参数范例：{compress, D:/TestFiles/Base, D:/TestFiles/Srcs/1.txt|D:/TestFiles/Srcs/2.txt }";
        }

        public string[] GetParametersInfo()
        {
            string[] t = new string[3];
            t[0] = "[0]操作类型，总是compress";
            t[1] = "[1]项目的根目录ProjectPath，压缩后的文件将存于此处，同时也是临时文件夹创建位置";
            t[2] = "[2]文件列表，以竖线‘|’分隔的全路径";
            return t;
        }

        #endregion
    }
}
